#!/usr/bin/env ruby
# frozen_string_literal: true

require "action_mailer"

# Make this your email address. Poor example.com gets SO MUCH MAIL
YOUR_EMAIL = "nobody@example.com"

# Change these to be the same settings as your Discourse environment
DISCOURSE_SMTP_ADDRESS = "smtp.example.com" # (mandatory)
@DISCOURSE_SMTP_PORT = 587 # (optional)
@DISCOURSE_SMTP_USER_NAME = "username" # (optional)
@DISCOURSE_SMTP_PASSWORD = "blah" # (optional)
#@DISCOURSE_SMTP_OPENSSL_VERIFY_MODE = "none"       # (optional) none|peer|client_once|fail_if_no_peer_cert

# Note that DISCOURSE_SMTP_ADDRESS should NOT BE ALLOWED to relay mail to
# YOUR_EMAIL without authentication
MAILFROM = @DISCOURSE_SMTP_USER_NAME || YOUR_EMAIL
MAILTO = YOUR_EMAIL

### You shouldn't need to change anything below here
$delivery_options = {
  user_name: @DISCOURSE_SMTP_USER_NAME || nil,
  password: @DISCOURSE_SMTP_PASSWORD || nil,
  address: DISCOURSE_SMTP_ADDRESS,
  port: @DISCOURSE_SMTP_PORT || nil,
  openssl_verify_mode: @DISCOURSE_SMTP_OPENSSL_VERIFY_MODE || nil,
}

class EmailTestMailer < ActionMailer::Base
  def email_test(mailfrom, mailto)
    mail(
      from: mailfrom,
      to: mailto,
      body: "Testing email settings",
      subject: "Discourse email settings test",
      delivery_method_options: $delivery_options,
    )
  end
end

message = EmailTestMailer.email_test(MAILFROM, MAILTO)

begin
  message.deliver_now()
rescue SocketError => e
  print "Delivery failed: " + e.message.strip() + "\n"
  print " Is the server hostname correct?\n"
rescue OpenSSL::SSL::SSLError => e
  print "Delivery failed: " + e.message.strip() + "\n"
  print " You probably need to change the ssl verify mode.\n"
rescue Net::SMTPAuthenticationError => e
  print "Delivery failed: " + e.message.strip() + "\n"
  print " Check to ensure your username and password are correct.\n"
rescue Net::SMTPFatalError => e
  print "Delivery failed: " + e.message.strip() + "\n"
  print " Check the above error and fix your settings.\n"
else
  print "Successfully delivered.\n"
end
